home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / linux-bo / etherboo.000 / etherboo / etherboot-2.0 / netboot-freebsd / bootmenu.c < prev    next >
C/C++ Source or Header  |  1996-06-01  |  11KB  |  339 lines

  1. /**************************************************************************
  2. NETBOOT -  BOOTP/TFTP Bootstrap Program
  3.  
  4. Author: Martin Renters
  5.   Date: Dec/93
  6.  
  7. **************************************************************************/
  8. #include "netboot.h"
  9.  
  10. void cmd_ip(), cmd_server(), cmd_kernel(), cmd_help();
  11. void cmd_rootfs(), cmd_swapfs(), cmd_interface(), cmd_hostname();
  12. void cmd_netmask(), cmd_swapsize(), cmd_swapopts(), cmd_rootopts();
  13. void cmd_linuxcmd(),cmd_aui();
  14.  
  15. struct bootcmds_t {
  16.     char *name;
  17.     void (*func)();
  18.     char *help;
  19. } bootcmds[] = {
  20. /*    {"?",        cmd_help,    "                 this list"}, */
  21.     {"help",    cmd_help,    "              this list"},
  22.     {"ip",        cmd_ip,        "<addr>          set my IP addr"},
  23.     {"server",    cmd_server,    "<addr>      set TFTP server IP addr"},
  24.     {"netmask",    cmd_netmask,    "<addr>     set network mask"},
  25.     {"hostname",    cmd_hostname,    "<name>    set hostname"},
  26.     {"kernel",    cmd_kernel,    "<file>      set boot filename"},
  27.     {"rootfs",    cmd_rootfs,    "ip:/fs      set root filesystem"},
  28.     {"swapfs",    cmd_swapfs,    "ip:/fs      set swap filesystem"},
  29.     {"swapsize",    cmd_swapsize,    "<nblks>   set swap size"},
  30.     {"swapopts",    cmd_swapopts,    "<options> swap mount options"},
  31.     {"rootopts",    cmd_rootopts,    "<options> root mount options"},
  32.     {"linuxcmd",    cmd_linuxcmd,   "<cmds>    pass cmds to linux"},
  33.     {"diskboot",    exit,        "          boot from disk"},
  34.     {"autoboot",    NULL,        "          continue"},
  35.         {"trans",       cmd_aui,        "<on|off>     turn transceiver on|off"},
  36.     {NULL,        NULL,        NULL}
  37. };
  38.  
  39. /**************************************************************************
  40. CMD_HELP - Display help screen
  41. **************************************************************************/
  42. void cmd_help()
  43. {
  44.     struct bootcmds_t *cmd = bootcmds;
  45.     printf("\r\n");
  46.     while (cmd->name) {
  47.         printf("%s %s\n\r",cmd->name,cmd->help);
  48.         cmd++;
  49.     }
  50. }
  51.  
  52. /**************************************************************************
  53. CMD_IP - Set my IP address
  54. **************************************************************************/
  55. void cmd_ip(p)
  56.     char *p;
  57. {
  58.     if (!setip(p, &arptable[ARP_CLIENT].ipaddr)) {
  59.         printf("IP address is %I\r\n",
  60.             arptable[ARP_CLIENT].ipaddr);
  61.     } else default_netmask();
  62. }
  63.  
  64. /**************************************************************************
  65. CMD_AUI - Turn on-board transceiver on or off
  66. **************************************************************************/
  67. void cmd_aui(p)
  68.         char *p;
  69. {
  70.         if (*(p+1) == 'f') {
  71.                 aui = 1;
  72.                 eth_reset();
  73.                 return;
  74.         }
  75.         if (*(p+1) == 'n') {
  76.                 aui = 0;
  77.                 eth_reset();
  78.                 return;
  79.         }
  80.         printf ("Transceiver is %s\r\n",aui ? "off" : "on");
  81. }
  82.  
  83. /**************************************************************************
  84. CMD_SERVER - Set server's IP address
  85. **************************************************************************/
  86. void cmd_server(p)
  87.     char *p;
  88. {
  89.     int i;
  90.     if (!setip(p, &arptable[ARP_SERVER].ipaddr)) {
  91.         printf("Server IP address is %I\r\n",
  92.             arptable[ARP_SERVER].ipaddr);
  93.     } else        /* Need to clear arp entry if we change IP address */
  94.         for (i=0; i<ETHER_ADDR_SIZE; i++) arptable[ARP_SERVER].node[i] = 0;
  95. }
  96.  
  97. /**************************************************************************
  98. CMD_NETMASK - Set network mask
  99. **************************************************************************/
  100. void cmd_netmask(p)
  101.     char *p;
  102. {
  103.     if (!setip(p, &netmask)) {
  104.         netmask = ntohl(netmask);
  105.         printf("netmask is %I\r\n", netmask);
  106.     }
  107.     netmask = htonl(netmask);
  108. }
  109.  
  110. /**************************************************************************
  111. CMD_SWAPSIZE - Set number of blocks for swap
  112. **************************************************************************/
  113. void cmd_swapsize(p)
  114.     char *p;
  115. {
  116.     int blks = getdec(&p);
  117.     if (blks > 0) nfsdiskless.swap_nblks = blks;
  118.     else printf("Swap size is: %d blocks\r\n",nfsdiskless.swap_nblks);
  119. }
  120.  
  121. /**************************************************************************
  122. CMD_KERNEL - set kernel filename
  123. **************************************************************************/
  124. void cmd_kernel(p)
  125.     char *p;
  126. {
  127.     if (*p) sprintf(kernel = kernel_buf,"%s",p);
  128.     printf("Bootfile is: %s\r\n", kernel);
  129. }
  130.  
  131.  
  132. /**************************************************************************
  133. CMD_ROOTFS - Set root filesystem name
  134. **************************************************************************/
  135. void cmd_rootfs(p)
  136.     char *p;
  137. {
  138.     if (!setip(p, &arptable[ARP_ROOTSERVER].ipaddr)) {
  139.         printf("Root filesystem is %I:%s\r\n",
  140.             htonl(nfsdiskless.root_saddr.sin_addr.s_addr),
  141.             nfsdiskless.root_hostnam);
  142.     } else {
  143.         convert_ipaddr((char *)&nfsdiskless.root_saddr.sin_addr,
  144.                    (char *)&arptable[ARP_ROOTSERVER].ipaddr);
  145.         while (*p && (*p != ':')) p++;
  146.         if (*p == ':') p++;
  147.         sprintf(&nfsdiskless.root_hostnam, "%s", p);
  148.     }
  149. }
  150.  
  151. /**************************************************************************
  152. CMD_SWAPFS - Set swap filesystem name
  153. **************************************************************************/
  154. void cmd_swapfs(p)
  155.     char *p;
  156. {
  157.     if (!setip(p, &arptable[ARP_SWAPSERVER].ipaddr)) {
  158.         printf("Swap filesystem is %I:%s\r\n",
  159.             htonl(nfsdiskless.swap_saddr.sin_addr.s_addr),
  160.             nfsdiskless.swap_hostnam);
  161.     } else {
  162.         convert_ipaddr((char *)&nfsdiskless.swap_saddr.sin_addr,
  163.                    (char *)&arptable[ARP_SWAPSERVER].ipaddr);
  164.         while (*p && (*p != ':')) p++;
  165.         if (*p == ':') p++;
  166.         sprintf(&nfsdiskless.swap_hostnam, "%s", p);
  167.     }
  168. }
  169.  
  170. /**************************************************************************
  171. CMD_HOSTNAME - Set my hostname
  172. **************************************************************************/
  173. void cmd_hostname(p)
  174.     char *p;
  175. {
  176.     if (*p)
  177.         hostnamelen = ((sprintf(&nfsdiskless.my_hostnam,"%s",p) -
  178.             (char*)&nfsdiskless.my_hostnam) + 3) & ~3;
  179.     else    printf("Hostname is: %s\r\n",nfsdiskless.my_hostnam);
  180. }
  181. /**************************************************************************
  182. CMD_ROOTOPTS - Set root mount options
  183. **************************************************************************/
  184. void cmd_rootopts(p)
  185.         char *p;
  186. {
  187.         char *tmp;
  188.  
  189.         if (*p) {
  190.                 nfsdiskless.root_args.flags = NFSMNT_RSIZE | NFSMNT_WSIZE;
  191.                 nfsdiskless.root_args.sotype = SOCK_DGRAM;
  192.                 if ((tmp = (char *)substr(p,"rsize=")))
  193.                         nfsdiskless.root_args.rsize=getdec(&tmp);
  194.                 if ((tmp = (char *)substr(p,"wsize=")))
  195.                         nfsdiskless.root_args.wsize=getdec(&tmp);
  196.                 if ((tmp = (char *)substr(p,"resvport")))
  197.                         nfsdiskless.root_args.flags |= NFSMNT_RESVPORT;
  198.                 if ((tmp = (char *)substr(p,"intr")))
  199.                         nfsdiskless.root_args.flags |= NFSMNT_INT;
  200.                 if ((tmp = (char *)substr(p,"soft")))
  201.                         nfsdiskless.root_args.flags |= NFSMNT_SOFT;
  202.                 if ((tmp = (char *)substr(p, "tcp")))
  203.                          nfsdiskless.root_args.sotype = SOCK_STREAM;
  204.         } else {
  205.                 printf("Rootfs mount options: rsize=%d,wsize=%d",
  206.                 nfsdiskless.root_args.rsize,
  207.                 nfsdiskless.root_args.wsize);
  208.                 if (nfsdiskless.root_args.flags & NFSMNT_RESVPORT)
  209.                         printf (",resvport");
  210.                 if (nfsdiskless.root_args.flags & NFSMNT_SOFT)
  211.                         printf (",soft");
  212.                 if (nfsdiskless.root_args.flags & NFSMNT_INT)
  213.                         printf (",intr");
  214.                 if (nfsdiskless.root_args.sotype == SOCK_STREAM)
  215.                         printf (",tcp");
  216.                 else
  217.                         printf (",udp");
  218.                 printf ("\r\n");
  219.         }
  220. }
  221.  
  222. /**************************************************************************
  223. CMD_SWAPOPTS - Set swap mount options
  224. **************************************************************************/
  225. void cmd_swapopts(p)
  226.         char *p;
  227. {
  228.     char *tmp;
  229.  
  230.     if (*p) {
  231.                 nfsdiskless.swap_args.flags = NFSMNT_RSIZE | NFSMNT_WSIZE;
  232.                 nfsdiskless.swap_args.sotype = SOCK_DGRAM;
  233.         if ((tmp = (char *)substr(p,"rsize=")))
  234.             nfsdiskless.swap_args.rsize=getdec(&tmp);
  235.         if ((tmp = (char *)substr(p,"wsize=")))
  236.             nfsdiskless.swap_args.wsize=getdec(&tmp);
  237.         if ((tmp = (char *)substr(p,"resvport")))
  238.             nfsdiskless.swap_args.flags |= NFSMNT_RESVPORT;
  239.         if ((tmp = (char *)substr(p,"intr")))
  240.             nfsdiskless.swap_args.flags |= NFSMNT_INT;
  241.         if ((tmp = (char *)substr(p,"soft")))
  242.             nfsdiskless.swap_args.flags |= NFSMNT_SOFT;
  243.         if ((tmp = (char *)substr(p, "tcp")))
  244.              nfsdiskless.swap_args.sotype = SOCK_STREAM;
  245.         } else {
  246.         printf("Swapfs mount options: rsize=%d,wsize=%d",
  247.         nfsdiskless.swap_args.rsize,
  248.         nfsdiskless.swap_args.wsize);
  249.         if (nfsdiskless.swap_args.flags & NFSMNT_RESVPORT)
  250.             printf (",resvport");
  251.         if (nfsdiskless.swap_args.flags & NFSMNT_SOFT)
  252.             printf (",soft");
  253.         if (nfsdiskless.swap_args.flags & NFSMNT_INT)
  254.             printf (",intr");
  255.         if (nfsdiskless.swap_args.sotype == SOCK_STREAM)
  256.             printf (",tcp");
  257.         else
  258.             printf (",udp");
  259.         printf ("\r\n");
  260.         }
  261. }
  262.  
  263. /**************************************************************************
  264. LINUXCMD - Pass commands to linux
  265. **************************************************************************/
  266. void cmd_linuxcmd(p)
  267.     char *p;
  268. {
  269.   if (*p)
  270.     linux_add_cmdline(p);
  271.   else
  272.     printf("Linux cmdline: %s\r\n",linux_add_cmdline(p));
  273.   return;
  274. }
  275.  
  276. /**************************************************************************
  277. EXECUTE - Decode command
  278. **************************************************************************/
  279. int execute(buf)
  280.     char *buf;
  281. {
  282.     char *p, *q;
  283.     struct bootcmds_t *cmd = bootcmds;
  284.     if ((!(*buf)) || (*buf == '#')) return(0);
  285.     while(cmd->name) {
  286.         p = buf;
  287.         q = cmd->name;
  288.         while (*q && (*(q++) == *(p++))) ;
  289.         if ((!(*q)) && ((*p == ' ') || (!(*p)))) {
  290.             if (!cmd->func) return(1);
  291.             while (*p == ' ') p++;
  292.             (cmd->func)(p);
  293.             return(0);
  294.         } else
  295.             cmd++;
  296.     }
  297.     printf("error: `help' for list\n\r");
  298.     return(0);
  299. }
  300.  
  301. /**************************************************************************
  302. BOOTMENU - Present boot options
  303. **************************************************************************/
  304. void bootmenu()
  305. {
  306.     unsigned long time;
  307.     char cmd[80];
  308.     int ptr, c;
  309.     linux_add_cmdline(0); /* clear linux cmdline */
  310.     printf(" \r\n");
  311.     while (1) {
  312.         ptr = 0;
  313.         printf("boot> ");
  314.         while (ptr < 80) {
  315.             for (time = currticks() + 90*18; !iskey() ;)
  316.                 if (time < currticks()) {
  317.                     printf("autoboot\r\n");
  318.                     goto done; }    
  319.             c = getchar();
  320.             if (c == '\r')
  321.                 break;
  322.             else if (c == '\b') {
  323.                 if (ptr > 0) {
  324.                     ptr--;
  325.                     printf("\b \b");
  326.                 }
  327.             } else {
  328.                 cmd[ptr++] = c;
  329.                 putchar(c);
  330.             }
  331.         }
  332.         cmd[ptr] = 0;
  333.         printf("\r\n");
  334.         if (execute(cmd)) break;
  335.     }
  336.     done:
  337.     eth_reset();
  338. }
  339.